/**
 * NOLINT(legal/copyright)
 *
 * The file src/common/memory/fling.h is referred and derived from project
 * flingfd,
 *
 *    https://github.com/sharvil/flingfd/blob/master/src/flingfd.h
 *
 * which has the following license:
 *
// Copyright 2013 Sharvil Nanavati
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
 */

// FLING: Exchanging file descriptors over sockets
//
// This is a little library for sending file descriptors over a socket
// between processes. The reason for doing that (as opposed to using
// filenames to share the files) is so (a) no files remain in the
// filesystem after all the processes terminate, (b) to make sure that
// there are no name collisions and (c) to be able to control who has
// access to the data.
//
// Most of the code is from https://github.com/sharvil/flingfd
#ifndef SRC_COMMON_MEMORY_FLING_H_
#define SRC_COMMON_MEMORY_FLING_H_

#include <sys/socket.h>
#include <sys/uio.h>

#ifdef __cplusplus
extern "C" {
#endif
// This is necessary for Mac OS X, see http://www.apuebook.com/faqs2e.html
// (10).
#if !defined(CMSG_SPACE) && !defined(CMSG_LEN)
#define CMSG_SPACE(len) \
  (__DARWIN_ALIGN32(sizeof(struct cmsghdr)) + __DARWIN_ALIGN32(len))
#define CMSG_LEN(len) (__DARWIN_ALIGN32(sizeof(struct cmsghdr)) + (len))
#endif

void init_msg(struct msghdr* msg, struct iovec* iov, char* buf, size_t buf_len);

// Send a file descriptor over a unix domain socket.
//
// @param conn Unix domain socket to send the file descriptor over.
// @param fd File descriptor to send over.
// @return Status code which is < 0 on failure.
int send_fd(int conn, int fd);

// Receive a file descriptor over a unix domain socket.
//
// @param conn Unix domain socket to receive the file descriptor from.
// @return File descriptor or a value < 0 on failure.
int recv_fd(int conn);

#ifdef __cplusplus
}
#endif

#endif  // SRC_COMMON_MEMORY_FLING_H_
